﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace InfoWykaz
{

    public partial class PacjenciPrzyjeciPonownieXDni : Form, Wykaz
    {
        public PacjenciPrzyjeciPonownieXDni()
        {
            InitializeComponent();
        }

        class wykaz1
        {
            public string id_pac = "";
            public string imie = "";
            public string nazwisko = "";
            public string pesel = "";
            public DateTime dtPrzyj = DateTime.MinValue;
            public DateTime dtWyp = DateTime.MinValue;
            public string jos = "";
            public string ksNr = "";
            public string ksRok = "";
        }

        private DataTable wykazResult;

        public DataTable result()
        {
            return this.wykazResult;
        }

        //sprawdzenie czy wprowadzone dane są poprawne
        public bool isFormOk()
        {
            if (this.dtOd.Value <= this.dtDo.Value)
            {
                if (this.dtDo.Value >= this.dtOd.Value) return true;
                else MessageBox.Show("Data do nie może być mniejsza niż data od.");
            }
            else MessageBox.Show("Data od nie może być większa niż data do.");
            return false;
        }

        //wykoanie wykazu
        private void button2_Click(object sender, EventArgs e)
        {
            if (this.isFormOk())
            {
                try
                {
                    string idk_jos = "";
                    if (this.jos.Text.Length > 0) idk_jos = string.Format(" and h.idk_jos='{0}' ", this.jos.Text);
                    DataTable query = OraCon.ConnectAndQuery(string.Format(
                        "select distinct p.id_pac,po.id_opi,po.id_pob, p.nazwisko,p.imiona,p.pesel, to_char(h.dt_zak_opi,'DD-MM-YYYY HH24:MI') as D2,h.idk_jos,h.dt_przyj,to_char(h.dt_przyj,'DD-MM-YYYY HH24:MI')as D1,h.ks_glo_nr,h.ks_glo_rok from sysadm.pacjent p, sysadm.hospitalizacja h, sysadm.pobyt po where h.dt_przyj >= to_date('{0}','YYYY-MM-DD HH24:MI') and h.dt_przyj <= to_date('{1}','YYYY-MM-DD HH24:MI') and p.id_pac=po.id_pac and po.id_opi=h.id_opi and po.status not in ('SKO') {2} group by p.id_pac, po.id_opi, po.id_pob, p.nazwisko, p.imiona, p.pesel, to_char(h.dt_zak_opi,'DD-MM-YYYY HH24:MI'), h.idk_jos, h.dt_przyj, to_char(h.dt_przyj,'DD-MM-YYYY HH24:MI'), h.ks_glo_nr, h.ks_glo_rok",
                        OraCon.getDate(this.dtOd.Value),
                        OraCon.getDate(this.dtDo.Value),
                        idk_jos));
                    //this.dataGridView1.DataSource = query;
                    //Dictionary<string, wykaz1> pacjenci = new Dictionary<string, wykaz1>();
                    //foreach (var c in query.Columns) MessageBox.Show(c.ToString());
                    HashSet<wykaz1> idiki = new HashSet<wykaz1>();
                    for (int x = 0; x < query.Rows.Count; x++)
                    {
                        var row = (from myRow in query.AsEnumerable() where myRow.Field<decimal>("id_pac").ToString() == query.Rows[x][0].ToString() select myRow);
                        if (row.Count() > 1)
                        {
                            List<wykaz1> res = new List<wykaz1>();
                            foreach (var i in row)
                            {
                                wykaz1 pac = new wykaz1();
                                pac.id_pac = i.Field<decimal>("id_pac").ToString();
                                pac.imie = i.Field<string>("imiona").ToString();
                                pac.nazwisko = i.Field<string>("nazwisko").ToString();
                                if (i.Field<string>("pesel") != null) pac.pesel = i.Field<string>("pesel").ToString();
                                pac.jos = i.Field<string>("idk_jos").ToString();
                                pac.ksNr = i.Field<decimal>("ks_glo_nr").ToString();
                                pac.ksRok = i.Field<decimal>("ks_glo_rok").ToString();
                                string dataPrzyj = i.Field<string>("D1").ToString();
                                string[] splited = dataPrzyj.Split('-');
                                pac.dtPrzyj = new DateTime(Int32.Parse(splited[2].Substring(0, splited[2].IndexOf(" "))), Int32.Parse(splited[1]), Int32.Parse(splited[0]));
                                if (i.Field<string>("D2") != null)
                                {
                                    string dataWyp = i.Field<string>("D2").ToString();
                                    string[] sWyp = dataWyp.Split('-');
                                    pac.dtWyp = new DateTime(Int32.Parse(sWyp[2].Substring(0, sWyp[2].IndexOf(" "))), Int32.Parse(sWyp[1]), Int32.Parse(sWyp[0]));
                                }

                                res.Add(pac);
                            }

                            wykaz1 poprzedni = null;
                            foreach (wykaz1 p in (from w in res orderby w.dtPrzyj ascending select w))
                            {
                                if (poprzedni != null)
                                {
                                    if (poprzedni.dtWyp != DateTime.MinValue)
                                    {
                                        TimeSpan span = p.dtPrzyj - poprzedni.dtWyp;
                                        if (span.TotalDays <= Double.Parse(this.liczbaDni.Value.ToString()))
                                        {
                                            if ((idiki.Count(c => c.id_pac == poprzedni.id_pac && c.dtPrzyj == poprzedni.dtPrzyj)) == 0) idiki.Add(poprzedni);
                                            if (idiki.Count(u => u.id_pac == p.id_pac && u.dtPrzyj == p.dtPrzyj) == 0) idiki.Add(p);
                                        }
                                    }
                                }
                                poprzedni = p;
                            }
                        }
                    }

                    //foreach (var i in idiki) MessageBox.Show(string.Format("{0} : {1} : {2}", i.id_pac, i.imie, i.dtPrzyj));

                    var result = (from o in idiki
                                  orderby o.id_pac
                                  select new
                                  {
                                      MIP = o.id_pac,
                                      Imie = o.imie,
                                      Nazwisko = o.nazwisko,
                                      PESEL = o.pesel,
                                      JOS = o.jos,
                                      Przyjecie = o.dtPrzyj,
                                      NrKg = o.ksNr,
                                      RokKg = o.ksRok
                                  }).ToList();
                    this.wykazResult = OraCon.LINQToDataTable(result);
                    this.Close();
                }
                catch(Exception ex)
                {
                    MessageBox.Show(string.Format("Błąd podczas wykonania wykazu! Error: {0}.", ex));
                }
            }
        }

        //pobranie josu
        private void button1_Click(object sender, EventArgs e)
        {
            PicDictValue _jos = new PicDictValue("Wybierz jednostkę :", 0, OraCon.ConnectAndQuery("select idk_jos, nazwa from sysadm.jos where stan_dostepn='D' and idk_jos!='SZPIT'"));
            _jos.ShowDialog();
            if (_jos.piced) this.jos.Text = _jos.value;
        }
    }
}
